#include "csvreader.h"
#include <QTextCodec>
#include <iostream>

namespace Graph {

static QTextCodec *codec = QTextCodec::codecForName("Windows-1251");

CSVReader::CSVReader(GraphManager * manager, QObject *parent) :
    QObject(parent), manager(manager)
{

}

void CSVReader::ReadNewFile(const QString &name)
{
    file.setFileName(name);
    sizeLine = 0;
    if (file.exists())
    {
        emit CurrentElementCount(0);
        manager->ClearData();

        // Блок подсчета количества строк в файле
        {
            file.open(QIODevice::ReadOnly);
            while(!file.atEnd())
            {
                auto string = file.readLine();
                QCoreApplication::processEvents();
                if (sizeLine == 0)
                {
                    QString str = codec->toUnicode(string);
                    QStringList lst = str.split(";");
                    for (int i = 1; i < lst.size(); i++)
                    {
                        int j = 0;
                        for (auto element = manager->GetData().begin();
                             element != manager->GetData().end(); element++)
                        {
                            if (element.key() == lst[i])
                            {
                                element.value()->SetColoumnFile(i);
                                break;
                            }
                            j++;
                        }
                        // Если ничего не нашли
                        if (j == manager->GetData().size())
                        {
                           auto graph = manager->AddNewGraph(lst[i], i);
                           connect(graph, SIGNAL(GraphIsVisible(const QString &)),
                                   this, SLOT(ChangeStatusElement(const QString &)));
                        }
                    }
                }
                sizeLine++;
            }
            file.close();
        }

        // Блок удаления лишних столбцов из базы данных
        {
            for (auto i = manager->GetData().begin();
                 i != manager->GetData().end(); i++)
            {
                QCoreApplication::processEvents();
                if ((*i)->GetColoumnFile() == 0)
                {
                    i = manager->DeleteGraph(i);
                }
            }
        }

        // Блок считывания новых данных
        {
            int i = 0;
            file.open(QIODevice::ReadOnly);
            file.readLine();
            while(!file.atEnd())
            {
                QCoreApplication::processEvents();
                auto str = codec->toUnicode(file.readLine());
                QStringList lst = str.split(";");
                emit CurrentElementCount(i * 100 / sizeLine);
                i++;
                if (lst.size() != manager->GetData().size() + 1)
                    continue;
                manager->PushTimeGraph(lst[0].replace(",", ".").toDouble());
                for (auto j : manager->GetData())
                {
                    if (j->IsVisible() == true)
                    {
                        j->PushBack(lst[j->GetColoumnFile()].replace(",", ".").toDouble());
                    }
                }
            }
            emit CurrentElementCount(100);
            QCoreApplication::processEvents();
            for (auto j : manager->GetData())
            {
                if (j->IsVisible() == true)
                {
                    j->RefreshData();
                }
            }
            manager->RefreshData();
            file.close();

        }



    }
}

void CSVReader::ChangeStatusElement(const QString &name)
{
    auto element = *manager->GetData().find(name);
    if (element->IsVisible())
    {
        file.open(QIODevice::ReadOnly);
        file.readLine();
        while(!file.atEnd())
        {
            auto str = codec->toUnicode(file.readLine());
            QStringList lst = str.split(";");
            if (lst.size() != manager->GetData().size() + 1)
                continue;

            element->PushBack(lst[element->GetColoumnFile()].replace(",", ".").toDouble());
        }
        element->RefreshData();
        file.close();
    }

    manager->RefreshData();

}

}
